home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / include / slist.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  4.8 KB  |  158 lines

  1. // Projet : Euterpe
  2. // Fichier : liste.h
  3.  
  4. // Auteur : Dominique Lorre
  5. // Date de création : 15/07/94
  6.  
  7. #ifndef CLASS_SLIST_H
  8. #define CLASS_SLIST_H
  9.  
  10. #include <exec/types.h>
  11.  
  12.  
  13. // =========================================================================
  14. // ========================== SLINK CLASS ==================================
  15. // =========================================================================
  16.  
  17.  
  18. class slink {
  19. friend class slist ;
  20. friend class slink_iter ;
  21.     slink *pred ;           // preceding node
  22.     slink *succ ;           // next node
  23. protected:
  24.     virtual  long type() const ;
  25. public:
  26.     long    indexof() ;                           // position in list
  27.  
  28.     slink() : pred(NULL), succ(NULL) {}
  29.     virtual ~slink() ;
  30.     virtual slink*  _follower() const
  31.     {slink *p = next() ;
  32.         while (p && p->type() != type()) p = p->next() ;
  33.         return p ;
  34.     }
  35.     virtual slink*  _predecessor() const
  36.     {slink *p = prev() ;
  37.         while (p && p->type() != type()) p = p->prev() ;
  38.         return p ;
  39.     }
  40.     slink*  next() const { return succ ; }     // move functions
  41.     slink*  prev() const { return pred ; }
  42.     slink*  follower() const
  43.     { return _follower() ; }
  44.     slink*  predecessor() const { return _predecessor() ; }
  45. };
  46.  
  47.  
  48. // =========================================================================
  49. // ========================== SLIST CLASS ==================================
  50. // =========================================================================
  51.  
  52.  
  53. class slist
  54. {
  55. friend class slink_iter ;
  56.     slink*  head ;
  57.     slink*  tail ;
  58. public:
  59.     slist() : head(NULL), tail(NULL) {}
  60.     virtual ~slist() ;
  61.     void    init() { head = tail = NULL ;}
  62.     void    free() ;
  63.     void    addhead(slink *) ;
  64.     void    addtail(slink *) ;
  65.     void    insert(slink *, slink *) ;
  66.     void    remove(slink *c) ;
  67.     BOOL    isempty() { return head ? FALSE : TRUE ; }
  68.     slink*  get(long) ;
  69.     slink*  first() { return head ; }
  70.     slink*  last() { return tail ; }
  71.     void    replace(slink *, slink *) ;
  72.     long    count() ;
  73. };
  74.  
  75. // =========================================================================
  76. // ======================== SLINK_ITER CLASS ===============================
  77. // =========================================================================
  78.  
  79.  
  80. class slink_iter {
  81.     slink*   current ;
  82.     slist*   cs ;
  83. public:
  84.     slink_iter(slist *s) : cs(s) { current = cs->head ; }
  85.     void set_current(slink* n) { current = n ; }
  86.     slink* get_current() { return current ; }
  87.  
  88.     slink* first() { return current = cs->head ; }
  89.     slink* last()  { return current = cs->tail ; }
  90.  
  91.     slink* operator++()     // préfixe
  92.     {
  93.         return current ? current = current->succ  : NULL ;
  94.     } // préfixe
  95.     slink* operator++(int)  // postfixe
  96.     {
  97.     slink *t = current ;
  98.         current = current? current->succ: NULL ;
  99.         return t ;
  100.     }
  101.     slink* operator--()     // préfixe
  102.     {
  103.     return current ? current = current->pred : NULL ;
  104.     }
  105.     slink* operator--(int)  // postfixe
  106.     {
  107.     slink *t = current ;
  108.         current = current ? current->pred : NULL ;
  109.         return t ;
  110.     }
  111. };
  112.  
  113. // =========================================================================
  114. // ========================== NLINK CLASS ==================================
  115. // =========================================================================
  116.  
  117.  
  118. class nlink : public slink {    // slink with name
  119. public:
  120.     STRPTR label ;
  121.     nlink() : label(NULL) {}
  122.     nlink*   next() { return (nlink *)slink::next() ; }
  123.     nlink*   prev() { return (nlink *)slink::prev() ; }
  124. };
  125.  
  126. // =========================================================================
  127. // ========================== NLIST CLASS ==================================
  128. // =========================================================================
  129.  
  130.  
  131. class nlist : public slist
  132. {
  133. public:
  134.     nlink*  findname(STRPTR name) ;
  135.     void    enqueue(nlink *node) ;
  136.     nlink* first() { return (nlink *)slist::first() ; }
  137.     nlink* last() { return (nlink *)slist::last() ; }
  138. };
  139.  
  140. // =========================================================================
  141. // ===================== NLINK_ITER CLASS ==================================
  142. // =========================================================================
  143.  
  144.  
  145. class nlink_iter : private slink_iter {
  146. public:
  147.     nlink_iter(slist *s) : slink_iter(s) {}
  148.     void set_current(nlink* n) { slink_iter::set_current((slink *)n) ; }
  149.     nlink* get_current() { return (nlink *)slink_iter::get_current() ; }
  150.     nlink* first() { return (nlink *) slink_iter::first() ; }
  151.     nlink* last() { return (nlink *) slink_iter::last() ; }
  152.     nlink* operator++() { return (nlink *) slink_iter::operator++(); }
  153.     nlink* operator++(int) { return (nlink *) slink_iter::operator++(0); }
  154.     nlink* operator--() { return (nlink *) slink_iter::operator--(); }
  155.     nlink* operator--(int) { return (nlink *) slink_iter::operator--(0); }
  156. };
  157.  
  158. #endif